package cn.iocoder.yudao.module.erp.service.pristock;

import java.util.*;

import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductRespVO;
import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO;
import jakarta.validation.*;
import cn.iocoder.yudao.module.erp.controller.admin.pristock.vo.*;
import cn.iocoder.yudao.module.erp.dal.dataobject.pristock.PriStockDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;

import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;

/**
 * ERP 一级库库存 Service 接口
 *
 * @author 芋道源码
 */
public interface PriStockService {

    /**
     * 创建ERP 一级库库存
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createPriStock(@Valid PriStockSaveReqVO createReqVO);

    /**
     * 更新ERP 一级库库存
     *
     * @param updateReqVO 更新信息
     */
    void updatePriStock(@Valid PriStockSaveReqVO updateReqVO);

    void inupdatePriStock(PriStockSaveReqVO priStockSaveReqVO);
    /**
     * 批量更新ERP 一级库库存
     *
     * @param updateReqVO 更新信息
     */
    void updatePriStocks(PriStockSaveReqVO priStockSaveReqVO);

    void updatePriStocksdelete(List<PriStockSaveReqVO> priStockSaveReqVO);
    /**
     * 删除ERP 一级库库存
     *
     * @param id 编号
     */
    void deletePriStock(Long id);

    /**
     * 获得ERP 一级库库存
     *
     * @param id 编号
     * @return ERP 一级库库存
     */
    PriStockDO getPriStock(Long id);

    /**
     * 获得ERP 一级库库存分页
     *
     * @param pageReqVO 分页查询
     * @return ERP 一级库库存分页
     */
    PageResult<PriStockDO> getPriStockPage(PriStockPageReqVO pageReqVO);

    /**
     * 获得产品 VO 列表
     *
     * @param ids 编号数组
     * @return 产品 VO 列表
     */
    List<PriStockRespVO> getPriStockVOList(Collection<Long> ids);
    /**
     * 获得产品 VO Map
     *
     * @param ids 编号数组
     * @return 产品 VO Map
     */
    default Map<Long, PriStockRespVO> getPriStockVOMap(Collection<Long> ids) {
        return convertMap(getPriStockVOList(ids), PriStockRespVO::getId);
    }

    /**
     * 获得所有产品 VO 列表
     *
     * @return 产品 VO 列表
     */
    List<PriStockDO> getPriStockList();

    /**
     * 获得ERP 一级库库存
     *
     * @param productId 编号
     * @return ERP 当前产品可选择批次
     */
    List<String> getBatchsByProductId(Long productId);

    PriStockDO getProductByBatch(Long productId, String productBatch);

    List<PriStockRespVO> getProductIds();

    void updatePristockCount(PriStockDO productByBatch);

    List<PriStockDO> getProductsByBatch(List<Object> collect);

    void updatePristockCountBatch(List<PriStockDO> stocksToUpdate);

    List<Integer> getIds();

    List<String> getStandardsByProductName(String productName);

    List<String> getInboundBatchsByProductId(Long productId, String productBatch);

    List<PriStockDO> getPriStockListByBatch();

    List<PriStockDO> selectStockListByProductBatch(List<PriStockDO> stocks);
}